module AppFormHelper


  #
  #=== 日付入力フィールドタグ文字列を返す
  #
  #日付ピックアップダイアログのアイコンを持つ
  #日付入力フィールドのタグを出力する。
  #
  def date_field(object_name, method, options = {})
    content_for(:for_ext_scripts) do
      opt = {:format => 'Y-m-d'}
      apply_ext((object_name.to_s+'_'+method.to_s), 'Ext.form.DateField', opt)
    end
    tag = text_field(object_name, method, options, false)
    return span_app_component_parent(tag)
  end


  #
  #=== 日付入力フィールドタグ文字列を返す
  #
  #日付ピックアップダイアログのアイコンを持つ
  #日付入力フィールドのタグを出力する。
  #
  def date_field_tag(name, value = nil, options = {})
    content_for(:for_ext_scripts) do
      opt = {:format => 'Y-m-d'}
      apply_ext((name.to_s), 'Ext.form.DateField', opt)
    end
    tag = text_field(object_name, method, options, false)
    return span_app_component_parent(tag)
  end


  #
  #=== テキストフィールドタグ文字列を返す
  #
  #テキストフィールドのタグを出力する。
  #
  def text_field(object_name, method, options = {}, ext=true)
    content_for(:for_ext_scripts) do
      apply_ext((object_name.to_s+'_'+method.to_s), 'Ext.form.TextField')
    end
    tag = super(object_name, method, options)
    return span_app_component_parent(tag)
  end


  #
  #=== テキストフィールドタグ文字列を返す
  #
  #テキストフィールドのタグを出力する。
  #
  def text_field_tag(name, value = nil, options = {}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        tmp_name = (options[:id]) ? options[:id] : name
        apply_ext((tmp_name.to_s), 'Ext.form.TextField')
      end
    end
    tag = super(name, value, options)
    return span_app_component_parent(tag)
  end


  #
  #=== テキストフィールドタグ文字列を返す
  #
  #パスワードフィールドのタグを出力する。
  #
  def password_field(object_name, method, options = {}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        apply_ext((object_name.to_s+'_'+method.to_s), 'Ext.form.TextField')
      end
    end
    tag = super( object_name, method, options )
    return span_app_component_parent(tag)
  end


  #
  #=== テキストエリアタグ文字列を返す
  #
  #テキストエリアのタグを出力する。
  #
  def text_area_tag(name, value=nil, options={}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        apply_ext((name.to_s), 'Ext.form.TextArea')
      end
    end
    tag = super(name, value, options)
    return span_app_component_parent(tag)
  end


  #
  #=== テキストエリアタグ文字列を返す
  #
  #テキストエリアのタグを出力する。
  #
  def text_area(object_name, method, options = {}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        apply_ext((object_name.to_s+'_'+method.to_s), 'Ext.form.TextArea')
      end
    end
    tag = super(object_name, method, options)
    return span_app_component_parent(tag)
  end


  #
  #=== 数値入力用テキストフィールドタグ文字列を返す
  #
  #数値入力用テキストフィールドのタグを出力する。
  #
  def number_text_field(object_name, method, options={}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        opt = {:allowDecimals=>false, :validateOnBlur=>false, :allowNegative=>false}
        apply_ext((object_name.to_s+'_'+method.to_s), 'Ext.form.NumberField', opt)
      end
    end
    tag = text_field( object_name, method, options, false )
    return span_app_component_parent(tag)
  end


  #
  #=== 数値入力用テキストフィールドタグ文字列を返す
  #
  #数値入力用テキストフィールドのタグを出力する。
  #
  def number_text_field_tag(name, value=nil, options={}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        opt = {:allowDecimals=>false, :validateOnBlur=>false, :allowNegative=>false}
        apply_ext((name.to_s), 'Ext.form.NumberField', opt)
      end
    end
    tag = text_field_tag(name, value, options, false)
    return span_app_component_parent(tag)
  end


  #
  #=== チェックボックスタグ文字列を返す
  #
  #チェックボックスのタグを出力する。
  #
  def check_box(object_name, method, options={}, checked_value="1", unchecked_value="0", ext=true)
    if ext
      content_for(:for_ext_scripts) do
        apply_ext((object_name.to_s+'_'+method.to_s), 'Ext.form.Checkbox')
      end
    end
    tag = super(object_name, method, options, checked_value, unchecked_value)
    return span_app_component_parent(tag)
  end


  #
  #=== チェックボックスタグ文字列を返す
  #
  #チェックボックスのタグを出力する。
  #
  def check_box_tag(name, value="1", checked=false, options={}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        apply_ext((name.to_s), 'Ext.form.Checkbox')
      end
    end
    tag = super(name, value, checked, options)
    return span_app_component_parent(tag)
  end


  #
  #=== 選択プルダウンタグ文字列を返す
  #
  #指定されたハッシュから選択プルダウンのタグを生成する。
  #
  def select(object, method, choices, options={}, html_options={}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        opt = {
          :editable  => false,
          :transform => object.to_s+'_'+method.to_s,
          :hiddenId  => object.to_s+'_'+method.to_s,
          :typeAhead => true,
          :triggerAction     => "all",
          :forceSelection    => true,
          :defaultAutoCreate => {:tag=>"input", :type=>"text", :autocomplete=>"off", :style=>html_options[:style].to_s }
        }
        apply_ext((object.to_s+'_'+method.to_s), 'Ext.form.ComboBox', opt, false)
      end
    end
    tag = super(object, method, choices, options, html_options)
    return span_app_component_parent(tag)
  end


  #
  #=== 選択プルダウンタグ文字列を返す
  #
  #指定されたハッシュから選択プルダウンのタグを生成する。
  #
  def select_tag(name, option_tags=nil, options={}, ext=true)
    if ext
      content_for(:for_ext_scripts) do
        opt = {
          :editable  => false,
          :transform => name.to_s,
          :hiddenId  => name.to_s,
          :typeAhead => true,
          :triggerAction     => "all",
          :forceSelection    => true,
          :defaultAutoCreate => {:tag=>"input", :type=>"text", :autocomplete=>"off", :style=>options[:style].to_s }
        }
        apply_ext((name.to_s), 'Ext.form.ComboBox', opt, false)
      end
    end
    option_tags = '<option value=""></option>' + option_tags if options[:include_blank]
    tag = super(name, option_tags, options)
    return span_app_component_parent(tag)
  end


  # 
  # private methods
  # 
  private

  #
  #=== Ext適用後のタグを返す
  #
  #指定されたコンポーネントにExtを適用する。
  #
  def apply_ext(name, component_name, options={}, markup=true)
    opt = options
    opt['id'] = name.to_s
    ext_tag = 'Ext.onReady(function(){'
    ext_tag << 'var cmp = new ' + component_name + '(' + opt.to_json + ');'
    ext_tag << 'cmp.applyToMarkup("'+ (name.to_s) +'");' if markup
    ext_tag << "});\n"
    ext_tag
  end

  #
  #=== CSS適用後のタグを返す
  #
  #指定されたタグをspanタグで囲みCSSクラスapp_component_parentを適用する。
  #
  def span_app_component_parent(tag)
    return '<span class="app_component_parent">' + tag + '</span>'
  end

end